#include "Sac.h"

 

/**
 * trie le sac par ordre croissant de poids
 */
void Sac::OrdonnerPoids()
{
    Objet *O = Contient.at(0);
    int i,j;

    for(i=0;i<Contient.size();i++){
        for(j=i;j<Contient.size();j++){
            if(Contient.at(i)->getPoids()>Contient.at(j)->getPoids()){
                O = Contient.at(i);
                Contient.at(i)=Contient.at(j);
                Contient.at(j)=O;
            }
        }
    }

}

/**
 * trie le sac par ordre croissant d'une statitistque
 * @argument stat:la statistique de trie
 * stat doit etre egal a int, fur ou def (intelligence, furtivite ou defense)
 * pour les objets non equipable, int, fur ou def prend la valeur de 0
 */
    void Sac::RangeStat(string stat)
    {
        Objet *O = Contient.at(0);
        int i,j;

        for(i=0;i<Contient.size();i++){
            for(j=i;j<Contient.size();j++){
                if(Contient.at(i)->getObjetStat(stat)>Contient.at(j)->getObjetStat(stat)){
                    O = Contient.at(i);
                    Contient.at(i)=Contient.at(j);
                    Contient.at(j)=O;
                }
            }
        }
    }

/**
 * affiche le contenu du sac
 * commence par la place disponible, le poids encore ajoutable
 * affiche nom objet/poids objet/intelligence/furtivite/defense
 * pour les objets non equipable, int, fur ou def prend la valeur de 0
 */

void Sac::AfficheSac(){
    cout<<endl;
    cout<<"######## Sac ########"<<endl<<endl;
    cout<<"place disponible"<<"\t\t"<<this->Capacite-this->Contient.size()<<endl;
    cout<<"poids ajoutable pour le sac"<<"\t"<<this->Poids_limite-this->getPoids()<<endl<<endl;
    
    if(Contient.size()!=0){
        cout<<"nom de l'objet \t poids objet \t bonus intelligence \t bonus furtivite \t bonus defense"<<endl<<endl;

        for(int i=0;i<Contient.size();i++){
            cout<<Contient.at(i)->getNom()<<"\t"<<Contient.at(i)->getPoids()<<"\t";
            if(Contient.at(i)->isEquipable()) cout<<Contient.at(i)->getObjetStat("int")<<"\t"<<Contient.at(i)->getObjetStat("fur")<<"\t"<<Contient.at(i)->getObjetStat("def")<<endl;
            else cout<<"Objet non equipable"<<endl;
        }
         cout<<endl;
    }
    else cout<<"Sac vide"<<endl<<endl;
}

/**
 * ajoute un objet dans le sac
 * @argument objet:l'objet a ajouter
 * verifie que l'objet est ajoutable en fonction de son poids et de la capacité du sac
 */
bool Sac::Ajouter(Objet &O){


    if(this->Capacite<this->Contient.size()+1)return false;

    int poids = this->getPoids()+O.getPoids();

    if(poids > this->getPoidsLimite()) return false;

    poids = this->myCharactere->getPoidsPorte()+ O.getPoids();

    if(poids>this->myCharactere->getChargeMax())return false;

    this->Contient.push_back(&O);

    return true;
    
}

/**
 * ajoute un objet dans le sac
 * @argument objet:l'objet a retirer
 * verifie que l'objet est bien dans le sac avant de le retirer
 */
bool Sac::Retirer(Objet &O){

    int i,j;
    vector< Objet* >::iterator ite = Contient.begin();

    for(i=0;i<Contient.size();i++){
        
        if(Contient.at(i)->getNom().compare(O.getNom())==0){
            Contient.erase(ite);
            return true;
        }
        ite++;
    }
    return false;
}

/**
 * renvoie le contenu du sac
 */
vector< Objet* > Sac::getObjets(){
    return Contient;
}

/**
 * renvoie la capacite du sac
 */
int Sac::getCapacite(){
    return Capacite;
}

/**
 * renvoie le poids limite stockable sac
 */
int Sac::getPoidsLimite(){
    return this->Poids_limite;
}

/**
 * renvoie le poids contenu dans le sac
 */
int Sac::getPoids(){
    int p=0;
    if(this->Contient.size()==0) return 0;
    for(int i=0;i<this->Contient.size();i++){
        p=p+this->Contient.at(i)->getPoids();
    }

    return p;
}